iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
自我挑戰組

30 天養大一個開源專案:baodao-skill 從零開始系列 第 24 篇

【Day 24】610 還是 644?圖書館名錄裡,多一個逗號就少算 34 館

  • 分享至 

  • xImage
  •  

昨天的統編驗收案例提醒我,測資選錯,程式也能一路綠燈。今天換 taiwan-library,看起來更沒難度:下載一份 CSV,挑出公共圖書館,回傳地址。結果最值得記下來的不是下載,而是「公共圖書館」到底該怎麼比對。

先確認手上拿的是什麼

這個 skill 用的是國家圖書館彙編的圖書館名錄,不是館藏搜尋。2026-10-01 重跑 repo 的下載指令,拿到 488,775 bytes、5,207 筆館舍資料,和文件 9/19 的基準一致。七個欄位依序是序號、中文館名、郵遞區號、縣市、區域、中文地址、圖書館類型。

第一個小坑還是編碼:這份 CSV 是 Big5,不是 UTF-8。今天直接用嚴格的 decode('big5') 解碼成功;我沒有用忽略錯誤的方式把亂碼藏起來。資料能讀,才開始算。

610 沒錯,644 也沒錯,問題是問法

如果用 類型 == '公共圖書館',答案是 610。如果問「類型裡包含公共圖書館的館舍」,答案是 644。差的 34 筆,類型全都寫成 專門圖書館, 公共圖書館。

不是今天突然多開了 34 間,也不是資料重複,而是同一欄允許複合分類。把它當單選欄位,程式照跑,結果卻悄悄少一截。這正是 SKILL 選用包含比對的原因。

2026-10-01 實測口徑 筆數
全部館舍紀錄 5,207
類型完全等於公共圖書館 610
類型為專門圖書館、公共圖書館的複合值 34
類型包含公共圖書館 644
上述包含比對,再限縣市為臺北市 63

63 也只代表這份名錄裡的符合紀錄,不代表現在開著的 63 間,更不代表每間都能現場借書。

一個可以重跑的小篩選

下面沿用 repo 的下載網址,再用標頭名稱取欄位。2026-10-01 實測,這段列出的前三筆是古亭智慧圖書館、城中分館、王貫英先生紀念圖書館。

curl -sm 30 -A 'Mozilla/5.0' -o /tmp/lib.csv 'https://www.ncl.edu.tw/OpenDataFile/0Q112417873324994331/4cbfc49a-1127-45b1-9da6-113ebb444a12'
python3 - <<'PY'
import csv, io
raw = open('/tmp/lib.csv', 'rb').read().decode('big5')
rows = list(csv.DictReader(io.StringIO(raw)))
public = [r for r in rows if '公共圖書館' in r['圖書館類型']]
taipei = [r for r in public if r['縣市'] == '臺北市']
print('全部', len(rows), '公共類型', len(public), '臺北市', len(taipei))
for r in taipei[:3]:
    print(r['中文館名'], '-', r['中文地址'])
PY

城中分館這筆地址是「臺北市中正區濟南路二段46號3樓」。有館名和地址,已經能回答一個窄問題:名錄裡有哪些符合條件的館舍。再往外多答一句,就可能越界。

錯誤處理:別把名錄說成借書服務

「附近有沒有圖書館」和「附近哪裡借得到這本書」不是同一題。前者還需要使用者的位置,以及距離判斷;後者需要各館館藏系統。這份 CSV 兩者都不會自動補上。開館時間、臨時休館、入館資格也不能從一個地址推出來。

  • 解碼失敗就停下檢查編碼,不把替代字元當成正常館名。
  • 下載失敗或拿到的不是 CSV,不用舊資料冒充這次查到的結果;repo 指向的備援入口是資料集 8306,要重新確認下載連結。
  • 篩選公共圖書館用包含比對;回報數字時,把口徑一起寫出來。
  • 名錄有學校與專門圖書館,不能把全表都推薦成對外開放的去處;是否能進館、借書,仍要向各館確認。

今天沒有改 repo。原本的包含比對是對的,我只是把它重跑一次,確認 610+34=644 仍成立。第 24 天的收穫很小,但很實際:回傳一個數字以前,先把那個數字在數什麼說清楚。


上一篇
【Day 23】完全不連網的 skill:統編檢核的數學,和文件驗收案例被抓包的一天
系列文
30 天養大一個開源專案:baodao-skill 從零開始 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言